package cn.edu.buaa.cnsatm.traffic_big_data_server.util;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.io.WKBReader;
import org.geotools.geojson.geom.GeometryJSON;

import java.io.StringWriter;

public class MultiRouteJsonArrayToGeoJsonUtil {
    public static String wkbToJson(String wkb) {
        String json = null;
        try {
            WKBReader reader = new WKBReader();
            Geometry geometry = reader.read(reader.hexToBytes(wkb));
            StringWriter writer = new StringWriter();
            GeometryJSON g = new GeometryJSON(20);
            g.write(geometry, writer);
            json = writer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return json;
    }

    public static String toGeoJson(JsonArray ja) {
        /**GeoJson格式的数据结构示例：
         * {
         *     "type":"FeatureCollection",//固定字段固定值
         *     "features":[//features为一个数组。
         *     { "type": "Feature",//固定字段固定值
         *       "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},//固定字段，里面的值来自于wkbToJson函数的转换结果
         *       "properties": {"prop0": "value0"}//原返回结果里面，除了geom/geographic字段剩余的字段值
         *       },
         *       { "type": "Feature",
         *          "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
         *          "properties": {"prop0": "value0"}
         *          },
         *     ]
         * }
         **/
        JsonObject geojsons = new JsonObject();
        geojsons.addProperty("type", "FeatureCollection");
        JsonArray featuresArray = new JsonArray();
        for (int i = 0; i < ja.size(); i++) {
            JsonObject jo = (JsonObject) ja.get(i);//jo表示的是获取到的每一条记录
//            System.out.println(jo);
            JsonObject geojson = new JsonObject();//geojson表示的是每一个Feature
            geojson.addProperty("type", "Feature");
            String property = new String();
            //目前传回的接口里，有两种字段是wkb格式的数据，一个是geom，一个就是geographic
            if (jo.has("geom")) {
                property = "geom";
            } else if (jo.has("geographic")) {
                property = "geographic";
            }
            if (property.isEmpty()) {
                //表示不包含需要转换的字段,直接结束循环，将原参数转换为String后返回。
                return ja.toString();
            } else {
                JsonObject geometry = (JsonObject) JsonParser.parseString(wkbToJson(jo.get(property).getAsString()));
                geojson.add("geometry", geometry);
                jo.remove(property);//删除已经转换完成的geom/geographic字段，将剩余的其它字段填充到properties字段里。
                //如果其余字段里还有一个center字段（主要是来自于getSectorByRegion接口里面的），则需要再将这个字段转换为geojson格式。
                if (jo.has("center") && !jo.get("center").isJsonNull()) {
                    JsonObject center = (JsonObject) JsonParser.parseString(wkbToJson(jo.get("center").getAsString()));
                    jo.remove("center");
                    jo.add("center", center);
                }
                geojson.add("properties", jo);
                featuresArray.add(geojson);
            }
        }
        geojsons.add("features", featuresArray);
        return geojsons.toString();
    }

    public static String multiRouteToGeomJson(JsonArray ja) {
        JsonObject geojsons = new JsonObject();
        geojsons.addProperty("type", "FeatureCollection");
        JsonArray featuresArray = new JsonArray();
        for (int i = 0; i < ja.size(); i++) {
            JsonObject jo = (JsonObject) ja.get(i);//jo表示的是获取到的每一条记录
//            System.out.println(jo);
            JsonObject geojson = new JsonObject();//geojson表示的是每一个Feature
            geojson.addProperty("type", "Feature");
            String property = new String();
            //目前传回的接口里，有两种字段是wkb格式的数据，一个是geom，一个就是geographic
            if (jo.has("geom")) {
                property = "geom";
            } else if (jo.has("geographic")) {
                property = "geographic";
            }
            if (property.isEmpty()) {
                //表示不包含需要转换的字段,直接结束循环，将原参数转换为String后返回。
                return ja.toString();
            } else {
                String geomJsonContent = jo.get("geom").toString();
                //System.out.println("***geomJsonContent:" + geomJsonContent);
                while (geomJsonContent.contains("\\")) {
                    //System.out.println("geomJsonContent.indexOf(\"\\\\\"):"+geomJsonContent.indexOf("\\"));
                    geomJsonContent = geomJsonContent.substring(0, geomJsonContent.indexOf("\\"))
                            + geomJsonContent.substring(geomJsonContent.indexOf("\\")+1);
                    //System.out.println("***RE geomJsonContent:" + geomJsonContent);
                }
                geomJsonContent=geomJsonContent.substring(1,geomJsonContent.length()-1);
                //System.out.println("***geomJsonContent:" + geomJsonContent);
                JsonObject geometry = (JsonObject) JsonParser.parseString(geomJsonContent);
                geojson.add("geometry", geometry);
//                System.out.println("***geometry:" + geometry);
                jo.remove(property);//删除已经转换完成的geom/geographic字段，将剩余的其它字段填充到properties字段里。
                //如果其余字段里还有一个center字段（主要是来自于getSectorByRegion接口里面的），则需要再将这个字段转换为geojson格式。
                if (jo.has("center") && !jo.get("center").isJsonNull()) {
                    JsonObject center = (JsonObject) JsonParser.parseString(wkbToJson(jo.get("center").getAsString()));
                    jo.remove("center");
                    jo.add("center", center);
                }
                geojson.add("properties", jo);
                featuresArray.add(geojson);
            }
        }
        geojsons.add("features", featuresArray);

//        System.out.println("***geojsons.toString():" + geojsons.toString());
        return geojsons.toString();

    }
}
